[アップデート] GuardDutyがEKSクラスターへの脅威の検出をサポートしました!
みなさん、こんにちは!
福岡オフィスの青柳です。
Amazon GuardDutyがAmazon Elastic Kubernetes Service (Amazon EKS)クラスターへの脅威の検出をサポートしました!
Amazon GuardDuty now protects Amazon Elastic Kubernetes Service clusters
この新しい機能はGuardDutyにおいて「GuardDuty for EKS Protection」あるいは「Kubernetes Protection」と呼ばれています。
(2020年に追加された「S3保護」機能と同じ扱いになるようです)
EKS Protection機能を使用することで、EKSクラスターに対する疑わしいアクティビティと潜在的なセキュリティ侵害を、GuardDutyを通して検出できるようになります。
設定方法
「GuardDuty for EKS Protection」の機能を利用するための設定について説明します。
GuardDutyの設定
「GuardDuty for EKS Protection」の機能はデフォルトで有効になっています。
当機能がリリースされた後にGuardDutyを有効にしたアカウント・リージョンであっても、以前からGuardDutyを有効にしていたアカウント・リージョンであっても、いずれの場合も「GuardDuty for EKS Protection」機能はデフォルトで有効になります。
現在「GuardDuty for EKS Protection」機能が有効になっているかどうかを確認するには、AWSマネジメントコンソールで「GuardDuty」→「設定」→「Kubernetes Protection」を選択します。
なお、「GuardDuty for EKS Protection」機能を利用したくない場合は、アカウント・リージョン毎に個別に無効化することもできます。
上図の画面で「無効化」のリンクをクリックすると、下図の画面になるので「無効化」を選択します。
EKSの設定
「GuardDuty for EKS Protection」機能の利用にあたり、EKS側で特に設定を行う必要はありません。
「GuardDuty for EKS Protection」機能は、EKSクラスターの「監査ログ」(Audit Logs) を自動的に検査して、脅威の検出を行います。
EKSクラスターには「ログ記録の有効/無効」の設定項目があり、そこには「監査ログ」の記録の有効/無効の設定も存在しますが、ログ記録の有効/無効の設定如何に関わらず「GuardDuty for EKS Protection」機能は利用可能となっています。
2022/01/28 14:00更新
記事初出時に「『GuardDuty for EKS Protection』機能を利用する場合は、対象のEKSクラスターで『監査ログ』の出力を有効化する必要がある」旨の記載がありましたが、正しくは「EKSクラスターの『監査ログ』出力の有効/無効の設定にかかわらず、『GuardDuty for EKS Protection』機能は利用可能」です。
検出できる脅威
「GuardDuty for EKS Protection」機能によって検出される脅威は、以下の27種類の「検索タイプ」に分類されます。
- CredentialAccess:Kubernetes/MaliciousIPCaller
- CredentialAccess:Kubernetes/MaliciousIPCaller.Custom
- CredentialAccess:Kubernetes/SuccessfulAnonymousAccess
- CredentialAccess:Kubernetes/TorIPCaller
- DefenseEvasion:Kubernetes/MaliciousIPCaller
- DefenseEvasion:Kubernetes/MaliciousIPCaller.Custom
- DefenseEvasion:Kubernetes/SuccessfulAnonymousAccess
- DefenseEvasion:Kubernetes/TorIPCaller
- Discovery:Kubernetes/MaliciousIPCaller
- Discovery:Kubernetes/MaliciousIPCaller.Custom
- Discovery:Kubernetes/SuccessfulAnonymousAccess
- Discovery:Kubernetes/TorIPCaller
- Execution:Kubernetes/ExecInKubeSystemPod
- Impact:Kubernetes/MaliciousIPCaller
- Impact:Kubernetes/MaliciousIPCaller.Custom
- Impact:Kubernetes/SuccessfulAnonymousAccess
- Impact:Kubernetes/TorIPCaller
- Persistence:Kubernetes/ContainerWithSensitiveMount
- Persistence:Kubernetes/MaliciousIPCaller
- Persistence:Kubernetes/MaliciousIPCaller.Custom
- Persistence:Kubernetes/SuccessfulAnonymousAccess
- Persistence:Kubernetes/TorIPCaller
- Policy:Kubernetes/AdminAccessToDefaultServiceAccount
- Policy:Kubernetes/AnonymousAccessGranted
- Policy:Kubernetes/ExposedDashboard
- Policy:Kubernetes/KubeflowDashboardExposed
- PrivilegeEscalation:Kubernetes/PrivilegedContainer
出典: GuardDuty Kubernetes finding types - Amazon GuardDuty
検出タイプの名前は「脅威の目的:リソース名/脅威の内容」というフォーマットになっています。
これらのうち「脅威の内容」は以下のようになっています。
「脅威の内容」 | 説明 |
---|---|
MaliciousIPCaller | 既知の悪意のあるIPアドレスからKubernetes APIが呼び出された |
MaliciousIPCaller.Custom | カスタム脅威リストに登録されたIPアドレスからKubernetes APIが呼び出された |
SuccessfulAnonymousAccess | 認証されていないユーザーによってKubernetes APIが呼び出された |
TorIPCaller | 匿名化された通信元からKubernetes APIが呼び出された |
ExecInKubeSystemPod | 名前空間 "kube-system" のポッド内でコマンドが実行された |
ContainerWithSensitiveMount | ポッドが機密性の高い外部ボリュームへマウントされた状態で起動した |
AdminAccessToDefaultServiceAccount | デフォルトサービスアカウントへクラスターに対する管理者特権が付与された |
AnonymousAccessGranted | 匿名ユーザーに対してクラスター操作権限が与えられた |
ExposedDashboard | Kubernetesダッシュボードがインターネットへ公開された |
KubeflowDashboardExposed | Kubeflowダッシュボードがインターネットへ公開された |
PrivilegedContainer | rootレベルアクセス権限を持つコンテナを起動した |
脅威の検出の動作を確認してみる
実際に「GuardDuty for EKS Protection」機能によって脅威が検出されることを確認したいと思います。
悪意のある攻撃を実際に行ってテストをするのは難しいですが、いくつかの検索タイプは故意に「脅威の検出」を発生させることが可能です。
今回は2パターンを試してみます。
「カスタム脅威リストに登録されたIPアドレスからKubernetes APIが呼び出された」
GuardDutyの「脅威リスト」へ、自分がインターネットへアクセスする際のグローバルIPアドレスを登録することで、「脅威」として検出されるようにします。
この状態で、kubectl
コマンドを使ってEKSクラスターへアクセスを試みます。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-10-0-3-93.ec2.internal Ready <none> 19m v1.21.5-eks-9017834
特に何ということのないコマンドであり、もちろん正常に実行することができます。
しばらくすると、GuardDutyの「結果」画面に以下のように出力されました。
検索タイプ「Discovery:Kubernetes/MaliciousIPCaller.Custom」の脅威として検出されたことを確認しました。
この時、EKSの監査ログにはどのように記録されているのかを確認します。
監査ログはCloudWatch Logsに出力されているため、脅威が検出された時刻付近のログを見てみます。
(※ 監査ログをCloudwatch Logsで確認するためには、EKSクラスターのログ記録の設定で「監査ログ」を有効化しておく必要があります)
/api/v1/nodes
というKubernetes APIがリクエストされたログが見つかりました。
これがkubectl get nodes
コマンドを実行した形跡です。
ユーザーの情報などに続いて、sourceIPs
に私がインターネットへアクセスする際のグローバルIPアドレスが記録されていました。
このIPアドレスがGuardDutyに設定した「脅威リスト」に含まれるIPアドレスと合致したということですね。
「名前空間 "kube-system" のポッド内でコマンドが実行された」
Kubernetesの名前空間 (Namespace) のうち "kube-system" は、Kubernetesの重要なシステムプロセスを実行するためのポッドが稼働しています。
攻撃者は、システムへの攻撃あるいは攻撃の下調べのために、これらのポッド上で何かしらのコマンドを実行することが考えられます。
「GuardDuty for EKS Protection」機能では、このようなアクティビティを「脅威」として検出します。
名前空間 "kube-system" で稼働しているポッドを確認します。
$ kubectl get pods --namespace=kube-system NAME READY STATUS RESTARTS AGE aws-node-fzpxz 1/1 Running 0 80m coredns-66cb55d4f4-6js4f 1/1 Running 0 87m coredns-66cb55d4f4-lhzqp 1/1 Running 0 87m kube-proxy-pbf6n 1/1 Running 0 80m
これらのうち「kube-proxy」ポッドへシェルログインを行い、コマンドを実行してみます。
$ kubectl exec kube-proxy-pbf6n --namespace=kube-system -it -- sh # ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var #
しばらくすると、以下のように「結果」画面に出力されました。
検索タイプ「Execution:Kubernetes/ExecInKubeSystemPod」の脅威として検出されたことを確認しました。
おわりに
EKSを利用する際のセキュリティ対策として「GuardDuty for EKS Protection」機能を活用することで、悪意のある攻撃や攻撃準備を検出したり、脆弱性のある設定が行われていないかを確認することができます。
設定も難しくないため、是非、利用することを検討してみてください!